/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:程序集容器类
 *
 *                                                                         *
 ***************************************************************************/

#ifndef PROGRAMSET_H
#define PROGRAMSET_H

#include "program.h"
#include "registerprins.h"
#include <QVector>
#include <QMutex>
#include <QStringList>
#include <QThread>
//#include "GeneralDefine.h"
//#include "messagelog.h"
#define D_MAX_PARSED_LINE 1000 //首次加载时最多提取的行数
#define D_ONE_PARSE_LINE_SIZE 20 //以后分析一次，提取的行数
#define D_CASH_PARSE_COUNT 100 //运行需要预备提取的行数

class ProgramRegExp;
/**
 * @brief The ProgramSet class 程序集容器类
 * //指令正则表达式涉及ｈｍｉ的　programcheck.cpp文件进行语法检查，
 * 同时涉及到ProgramDelegate::analysisＸＸＸＸInstruction()
 */
class ProgramSet :public QVector <Program>
{
public:
    ProgramSet();
    ~ProgramSet();

public:

    int getProgramString_byName(QString fileName,QVector<QString>  &programStrings);
    int getProgramString(QVector<QVector<QString> > &programStrings);


    /**修改了正则表达式的匹配，在原有的基础上在最后面增加了(.*)表示匹配除\n外的任意字符**/
    /**
     * @brief transferTextInstructionToStructData
     * @param strList
     * @param programNum
     * @param programName
     * @param programStatus
     * @param _robotId
     * @return 0代表成功，正数代表不识别的行号，负数无意义
     */
    int transferTextInstructionToStructData(QVector <QString> strList,int programNum,QString programName,int programStatus,int _robotId);
    int transferTextInstructionToStructData_onestep(int programNum);
    int examParse(int programNum,int lineId);


public:  

    int errCmdFlag;

    /**寄存器的值*/
    QVector <double> regRList;//无法同步到Reg.ProgramEngine::updateProgramSetRegister()
//    QVector <int> timer;
    /*******************************
     * 日期：２０１６－１２－２
     * 修改人：华磊
     * 修改原因：添加ｐｒ和ｐｌ寄存器
     * *****************************/
    /**
     * @brief regPrList     ｐｒ寄存器
     */
    QVector <PointPro> regPrList;//无法同步到Reg。需要修改则直接操作regData
    /**
     * @brief regPlList     ｐｌ寄存器
     */
    QVector <PlRegStruct> regPlList;//无法同步到Reg

    /**
     * @brief startTime             起始时间
     */
    QVector <timeval> startTime;
    /**
     * @brief endTime               终止时间
     */
    QVector <timeval> endTime;

    /**
     * @brief timerProcessType                  时间处理方式
     */
    QVector <TIMER_PROCESS_TYPE> timerProcessType;
//    QVector <TIMER_VOER_FLOW_TYPE> timerOverFlowType;
    /**
     * @brief countTimer            时间
     */
    QVector <double> countTimer;

//    RegisterOfPr  prDataList;
    /**
     * @brief pr    点的值
     */
    QVector <QVector<int> > pr;

    QVector <QVector <int> > plList;

    QVector <int> arList;
    QVector <int> prList;
    QVector <QVector <int> > pr2List;
    QVector <int> Gi;
    QVector <int> Go;
    QVector <int> Ai;
    QVector <int> Ao;
    QVector <int> Di;//not used
    QVector <int> Do;//not used
    QVector <int> Ri;
    QVector <int> Ro;
    QVector <int> Si;
    QVector <int> So;
    QVector <int> Ui;
    QVector <int> Uo;
    QVector <int> timer_overflow;
    QVector <int> uframeList;
    QVector <int> utoolList;

    /**存取点位信息*/
    QVector <int> pointList;

    QVector <int>  userNumList;
    QVector <int>  toolNumList;


    int userInfoErr;
    /**
     * @brief rFileErr      r寄存器数据文件标志
     */
    int rFileErr;
    /**
     * @brief prFileErr     pr寄存器数据文件标志
     */
    int prFileErr;
    /**
     * @brief plFileErr     pl寄存器数据文件标志
     */
    int plFileErr;
    /**
     * @brief robotId       当前机器人号码
     */
    int robotId;


    struct timeval patExectStartTime,patExectEndTime;

    struct timeval patStartTime,patEndTime;


    //-------------------------------------------------------------------------------------
private:


private:
     ProgramRegExp *programRegExp;
     QMutex mutex_programString;


};

#endif // PROGRAMSET_H



